import { createI18n } from 'vue-i18n';
import pinia from '/@/stores/index';
import { storeToRefs } from 'pinia';
import { useThemeConfig } from '/@/stores/themeConfig';

// 定义语言国际化内容

/**
 * 说明：
 * 须在 pages 下新建文件夹（建议 `要国际化界面目录` 与 `i18n 目录` 相同，方便查找），
 * 注意国际化定义的字段，不要与原有的定义字段相同。
 * 1、/src/i18n/lang 下的 ts 为框架的国际化内容
 * 2、/src/i18n/pages 下的 ts 为各界面的国际化内容
 */

// element plus 自带国际化 - 修正导入路径（使用.js扩展名）
import enLocale from 'element-plus/dist/locale/en.js';
import zhcnLocale from 'element-plus/dist/locale/zh-cn.js';
import zhtwLocale from 'element-plus/dist/locale/zh-tw.js';
import jajpLocale from 'element-plus/dist/locale/ja.js';
import frfrLocale from 'element-plus/dist/locale/fr.js';
import vivnLocale from 'element-plus/dist/locale/vi.js';

// 定义变量内容
const messages = {};
const element = { en: enLocale, 'zh-cn': zhcnLocale, 'zh-tw': zhtwLocale, 'ja-jp': jajpLocale, 'fr-fr': frfrLocale, 'vi-vn': vivnLocale };
const itemize = { en: [], 'zh-cn': [], 'zh-tw': [], 'ja-jp': [], 'fr-fr': [], 'vi-vn': [] };
const modules: Record<string, any> = import.meta.glob('./**/*.ts', { eager: true });

// 对自动引入的 modules 进行分类 en、zh-cn、zh-tw
// https://vitejs.cn/vite3-cn/guide/features.html#glob-import
for (const path in modules) {
	// 直接匹配所有.ts文件，提取语言代码
	// 例如：./lang/zh-cn.ts -> 语言代码：zh-cn
	// 例如：./pages/system/zh-cn.ts -> 语言代码：zh-cn，目录：system
	const langMatch = path.match(/(\w{2}(-\w{2})?)\.ts$/);
	if (langMatch) {
		const langCode = langMatch[1];
		const translations = modules[path].default;
		
		// 检查是否是pages目录下的文件
		const pagesMatch = path.match(/\.\/pages\/(\w+)\/[^/]+\.ts$/);
		if (pagesMatch) {
			// 提取pages下的子目录作为命名空间
			const pageNamespace = pagesMatch[1];
			// 将翻译内容包裹在命名空间下
			const namespacedTranslations = {
				[pageNamespace]: translations
			};
			if (itemize[langCode]) {
				itemize[langCode].push(namespacedTranslations);
			}
		} else {
			// 非pages目录下的文件直接使用
			if (itemize[langCode]) {
				itemize[langCode].push(translations);
			}
		}
	}
}

// 合并数组对象（非标准数组对象，数组中对象的每项 key、value 都不同）
function mergeArrObj<T>(list: T, key: string) {
	let obj = {};
	list[key].forEach((i: EmptyObjectType) => {
		obj = Object.assign({}, obj, i);
	});
	return obj;
}

// 处理最终格式
for (const key in itemize) {
	// 合并所有翻译资源到根级别
	const mergedTranslations = mergeArrObj(itemize, key);
	messages[key] = {
		name: key,
		el: element[key].el,
		// 同时支持两种格式：直接访问和通过message访问
		...mergedTranslations,
		message: mergedTranslations,
	};
	
	// 调试：打印合并后的翻译结构
	console.log(`=== ${key} 翻译资源结构 ===`);
	console.log(JSON.stringify(mergedTranslations, null, 2));
}

// 读取 pinia 默认语言
const stores = useThemeConfig(pinia);
const { themeConfig } = storeToRefs(stores);

// 导出语言国际化
// https://vue-i18n.intlify.dev/guide/essentials/fallback.html#explicit-fallback-with-one-locale
export const i18n = createI18n({
	legacy: false,
	silentTranslationWarn: true,
	missingWarn: false,
	silentFallbackWarn: true,
	fallbackWarn: false,
	locale: themeConfig.value.globalI18n,
	fallbackLocale: zhcnLocale.name,
	messages,
});
